import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpEchoClient {
	private DatagramSocket socket=null;
	//socket是文件描述符中一个表项，每次打开一个文件都会占用一个位置
	//
	//这里socket不进行关闭为什么不会造成文件资源泄露
	//这个socket全局都会使用，如果提前关闭的话，就无法进行使用，
	//当我们不需要的时候，也就是进程结束的时候，进程结束，会将文件描述表销毁，这样不会造成文件资源的泄露

	//如何会泄露的呢?
	//当频繁的打开一个文件的时候，但是不关闭文件
	//时间一长，就会造成文件资源泄露

	//如果进程的声明周期很短，打开一下没多久就关闭了，这样也谈不上泄露
	private String serverIp="";
	private int serverPort=0;

	public UdpEchoClient(String ip, int port) throws SocketException {
		socket=new DatagramSocket();
		serverIp=ip;
		serverPort=port;
	}
	public void start() throws IOException {
		System.out.println("客户端启动！");
		Scanner scanner=new Scanner(System.in);
		while(true) {
			System.out.print("->");
			String request=scanner.next();
			//将这个数据包给打包
			DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
					InetAddress.getByName(serverIp), serverPort);
			//打包完进行发送
			socket.send(requestPacket);

			DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
			socket.receive(responsePacket);

			String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
			System.out.println(response);
		}
	}

	public static void main(String[] args) throws IOException {
		UdpEchoClient cilent=new UdpEchoClient("192.168.58.1",9090);
		cilent.start();
	}
}
